<?php
class SessionDeal implements SessionHandlerInterface {
	private $db;
	private $gcMaxlifetime;
	public function __construct($db){
		$this->db=$db;
		$this->gcMaxlifetime=ini_get('session.gc_maxlifetime');
	} 
	//开启session的时候执行		session_start()
	public function open($save_path,$name){
		return true;
	}
	//将会话信息读取到$_SESSION变量中的时候执行		session_start()
	public function read($session_id){
		$sql="select `data` from session where id='{$session_id}' and UNIX_TIMESTAMP() < expire";
		$this->db->execute($sql);
		if($this->db->affected_rows==1){
			return $this->db->result->fetch_array(MYSQLI_NUM)[0];
		}else{
			return '';
		}
	}
	//session垃圾回收机制启动的时候执行	
	public function gc($maxlifetime){
		$sql="delete from session where expire < UNIX_TIMESTAMP()";
		$this->db->execute($sql);
		if($this->db->affected_rows){
			return true;
		}else{
			return false;
		}
	}
	//把$_SESSION数据像资料库里面写的时候执行		脚本即将执行结束的时候一次性将$_SESSION里面的内容写入资料库
	public function write($session_id,$session_data){
		$sql="replace into session(id,data,expire) values('{$session_id}','{$session_data}',UNIX_TIMESTAMP()+{$this->gcMaxlifetime})";
		$this->db->execute($sql);
		if($this->db->affected_rows){
			return true;
		}else{
			return false;
		}
	}
	//销毁的时候执行	session_destroy();
	//执行了这个就不会再去执行write方法
	public function destroy($session_id){
		$sql="delete from session where id='{$session_id}'";
		$this->db->execute($sql);
		if($this->db->affected_rows==1){
			return true;
		}else{
			return false;
		}
	}
	//关闭的时候执行	在 write 函数执行完成时执行，它像类里面的析构函数
	public function close(){
		return true;
	}
}